<?php
defined ( 'BASEPATH' ) or exit ( 'No direct script access allowed' );
class Captcha {
	public $border = TRUE; // 图片边框
	public $num = 4; // 字符个数
	public $w = 60; // 图片宽度
	public $h = 30; // 图片高度
	public $fontsize = 50; // 字体大小
	public function __construct($params = array()) {
		/* 初始化参数 */
		foreach ( $params as $key => $val ) {
			if (isset ( $this->$key )) {
				$this->$key = $val;
			}
		}
	}
	/**
	 * 创建验证码
	 */
	public function create() {
		$alpha = "abcdefghijkmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; // 验证码内容1:字母
		$number = "1234567890"; // 验证码内容2:数字
		$randcode = ""; // 验证码字符串初始化
		srand ( ( double ) microtime () * 1000000 ); // 初始化随机数种子
		$im = ImageCreate ( $this->w, $this->h ); // 创建验证图片
		
		/*
		 * 绘制基本框架
		 */
		$bgcolor = ImageColorAllocate ( $im, 255, 255, 255 ); // 设置背景颜色
		ImageFill ( $im, 0, 0, $bgcolor ); // 填充背景色
		if ($this->border) {
			$black = ImageColorAllocate ( $im, 176, 196, 242 ); // 设置边框颜色
			ImageRectangle ( $im, 0, 0, $this->w - 1, $this->h - 1, $black ); // 绘制边框
		}
		/*
		 * 逐位产生随机字符
		 */
		for($i = 0; $i < $this->num; $i ++) {
			$alpha_or_number = mt_rand ( 0, 1 ); // 字母还是数字
			$str = $alpha_or_number ? $alpha : $number;
			$which = mt_rand ( 0, strlen ( $str ) - 1 ); // 取哪个字符
			$code = substr ( $str, $which, 1 ); // 取字符
			$j = ! $i ? 4 : $j + 15; // 绘字符位置
			$color3 = ImageColorAllocate ( $im, mt_rand ( 0, 100 ), mt_rand ( 0, 100 ), mt_rand ( 0, 100 ) ); // 字符随即颜色
			ImageChar ( $im, $this->fontsize, $j, 3, $code, $color3 ); // 绘字符
			$randcode .= $code; // 逐位加入验证码字符串
		}
		/*
		 * 添加干扰
		 */
		for($i = 0; $i < $this->num * 15; $i ++) 		// 绘背景干扰点
		{
			$color2 = ImageColorAllocate ( $im, mt_rand ( 0, 255 ), mt_rand ( 0, 255 ), mt_rand ( 0, 255 ) ); // 干扰点颜色
			ImageSetPixel ( $im, mt_rand ( 0, $this->w ), mt_rand ( 0, $this->h ), $color2 ); // 干扰点
		}
		// 把验证码字符串写入session
		/* 绘图结束 */
		Imagegif ( $im );
		ImageDestroy ( $im );
		return $randcode;
	}
}